import logging  # 日志库

import os


def setup_logger(logger_name, log_file_path=None, log_format=None):
    """
    设置日志格式和风格

    参数:
    logger_name - 记录器的名称，用于标识不同的日志记录器。
    log_file_path - （可选）日志文件的路径，用于指定日志保存的位置。默认为空字符串，表示仅输出到控制台，不写入文件。
    log_format - （可选）自定义的日志格式字符串。默认为空字符串，使用内置的默认格式。

    返回值:
    返回已配置好的日志记录器对象。
    """

    # 设置日志格式

    # 模仿了java的log4j的方式
    default_log_format = (
        "%(asctime)s | "  # 时间戳
        "%(levelname)s | "  # 日志级别
        "[%(filename)s:%(lineno)d] | "  # 文件名和行号
        "%(message)s"  # 消息
    )

    # 如果提供了自定义的日志格式，则使用它，否则使用默认的日志格式
    log_format = log_format or default_log_format

    color_formatter = logging.Formatter(log_format)

    # 创建指定名称的日志记录器
    logger = logging.getLogger(logger_name)
    if not logger.hasHandlers():  # 检查记录器是否已添加处理器，避免重复添加
        # 创建流处理器，用于将日志输出到标准输出（控制台）
        stream_handler = logging.StreamHandler()
        # 为流处理器设置格式化器，使其能够按照指定格式输出日志
        stream_handler.setFormatter(color_formatter)
        # 将流处理器添加到日志记录器中
        logger.addHandler(stream_handler)

        # 判断是否指定了日志文件路径
        if log_file_path:
            # 根据项目根目录下的log子目录构建完整的日志文件路径
            project_log_dir = os.path.join(os.getcwd(), 'logs')
            if not os.path.exists(project_log_dir):
                os.makedirs(project_log_dir)  # 如果log目录不存在，创建之
            full_log_file_path = os.path.join(project_log_dir, log_file_path)

            # 创建文件处理器，用于将日志写入指定文件
            file_handler = logging.FileHandler(full_log_file_path)
            file_handler.setFormatter(color_formatter)  # 使用无颜色的格式化器

            # 将文件处理器添加到日志记录器中
            logger.addHandler(file_handler)

        # 设置日志记录器的最低日志级别为DEBUG，表示将记录所有DEBUG级别及以上的日志信息
        logger.setLevel(logging.DEBUG)
    return logger
